/* 
 * File:   Sistema.cpp
 * Author: Arturo
 * 
 * Created on November 28, 2010, 11:30 PM
 */

#include "Sistema.h"
#include "NCliente.h"
#include "DProducto.h"
#include "DVenta.h"
#include "DPago.h"

Sistema* Sistema::instancia = NULL;

Sistema::Sistema() {
    this->web = &PLParametros::GetInstancia();
    this->cargoPlantilla();

    if (web->Param("page") == "clientes") contenidoClientes();
    else if (web->Param("page") == "nuevocliente") contenidoNuevoCliente();
    else if (web->Param("page") == "crearcliente") contenidoCrearCliente();
    else if (web->Param("page") == "eliminarcliente") contenidoEliminarCliente();

    else if (web->Param("page") == "productos") contenidoProductos();
    else if (web->Param("page") == "nuevoproducto") contenidoNuevoProducto();
    else if (web->Param("page") == "crearproducto") contenidoCrearProducto();
    else if (web->Param("page") == "eliminarproducto") contenidoEliminarProducto();

    else if (web->Param("page") == "ventasdelcliente") contenidoVentasDelCliente();
    else if (web->Param("page") == "pagosdelcliente") contenidoPagosDelCliente();

    else if (web->Param("page") == "ventas") contenidoVentas();
    else if (web->Param("page") == "nuevaventa") contenidoNuevaVenta();
    else if (web->Param("page") == "crearventa") contenidoCrearVenta();

    else if (web->Param("page") == "pagos") contenidoPagos();
    else if (web->Param("page") == "nuevopago") contenidoNuevoPago();
    else if (web->Param("page") == "crearpago") contenidoCrearPago();

    else contenidoDefault();
    
    this->plantilla.replace(this->plantilla.find("[PlantillaZonaCuerpo]", 0), 21, this->contenido);

    cout << "Content-type: text/html\n\n";
    cout << this->plantilla;
}

Sistema::~Sistema() {
}

Sistema &Sistema::GetInstancia() {
    if (instancia == NULL) {
        instancia = new Sistema();
    }

    return *instancia;
}

void Sistema::cargoPlantilla() {
    this->plantilla = "";
    char linea[10000];
    ifstream file("plantilla.xhtml");
    if (!file.fail()) {
        while (!file.eof()) {
            file.getline(linea, 10000);
            if (linea[0] != '\0') {
                this->plantilla += linea;
            }
        }
        file.close();
    }
}

void Sistema::contenidoDefault() {
    this->contenido = "";
    this->contenido += "<h1>Bienvenido a SmallStore!!!.</h1>";
    this->contenido += "<p>Sistema de tienda para el profe Jose Peñarrieta.</p>";
}



void Sistema::contenidoClientes() {
    this->contenido = "";
    this->contenido += "<h1>Lista de clientes</h1>";

    this->contenido += "<table>";

    DCliente* MisClientes = &DCliente::GetInstancia();

    while (MisClientes->Current) {
        this->contenido += "<tr>";
        this->contenido += "<td><a href='site?page=eliminarcliente&id=" + Util::NumberToString(((NCliente*)MisClientes->Current->Dato)->GetId()) + "'>Eliminar</a></td>";
        this->contenido += "<td>" + ((NCliente*)MisClientes->Current->Dato)->GetDni() + "</td>";
        this->contenido += "<td>" + ((NCliente*)MisClientes->Current->Dato)->GetNombre() + "</td>";
        this->contenido += "<td><a href='site?page=ventasdelcliente&id=" + Util::NumberToString(((NCliente*)MisClientes->Current->Dato)->GetId()) + "'>Ventas</a></td>";
        this->contenido += "<td><a href='site?page=pagosdelcliente&id=" + Util::NumberToString(((NCliente*)MisClientes->Current->Dato)->GetId()) + "'>Pagos</a></td>";
        this->contenido += "</tr>";

        MisClientes->Next();
    }

    this->contenido += "</table>";
    this->contenido += "<br />";
    this->contenido += "<a href='site?page=nuevocliente'>Nuevo cliente</a>";
}

void Sistema::contenidoNuevoCliente() {
    this->contenido = "";
    this->contenido += "<h1>Nuevo cliente</h1>";

    this->contenido += "<form method='post' action='site?page=crearcliente'>";
    this->contenido += "<div class='formulario'>";
    this->contenido += "<ul>";
    this->contenido += "<li><label>DNI</label><input name='dni' type='text'></li>";
    this->contenido += "<li><label>Nombre</label><input name='nombre' type='text'></li>";
    this->contenido += "<li><input type='submit' value='Crear'></li>";
    this->contenido += "</ul>";
    this->contenido += "</div>";
    this->contenido += "</form>";
}

void Sistema::contenidoCrearCliente() {
    this->contenido = "";

    this->contenido = "<meta http-equiv='Refresh' content='2; url=site?page=clientes'>";
    this->contenido += "<h1>Cliente creado!</h1>";

    DCliente* MisClientes = &DCliente::GetInstancia();
    MisClientes->Add(new NCliente(NULL, web->Param("nombre"), web->Param("dni")));
    MisClientes->Save();
}

void Sistema::contenidoEliminarCliente() {
    this->contenido = "";

    this->contenido = "<meta http-equiv='Refresh' content='2; url=site?page=clientes'>";
    this->contenido += "<h1>Cliente eliminado!</h1>";

    DCliente* MisClientes = &DCliente::GetInstancia();
    int id = atoi(web->Param("id").c_str());
    MisClientes->Find(id);

    MisClientes->Remove(MisClientes->Current->Dato);
    MisClientes->Save();
}



void Sistema::contenidoProductos() {
    this->contenido = "";
    this->contenido += "<h1>Lista de productos</h1>";

    this->contenido += "<table>";

    DProducto* datos = &DProducto::GetInstancia();

    while (datos->Current) {
        this->contenido += "<tr>";
        this->contenido += "<td><a href='site?page=eliminarproducto&id=" + Util::NumberToString(((NProducto*)datos->Current->Dato)->GetId()) + "'>Eliminar</a></td>";
        this->contenido += "<td>" + ((NProducto*)datos->Current->Dato)->GetNombre() + "</td>";
        this->contenido += "<td>" + Util::NumberToString(((NProducto*)datos->Current->Dato)->GetPrecio()) + "</td>";

        switch ( ((NProducto*)datos->Current->Dato)->TypeOf() ) {
            case 1:
                this->contenido += "<td>Musica</td>";
                this->contenido += "<td>" + ((Musica*)datos->Current->Dato)->GetArtista() + "</td>";
                break;
            case 2:
                this->contenido += "<td>Pelicula</td>";
                this->contenido += "<td>" + ((Pelicula*)datos->Current->Dato)->GetFormato() + "</td>";
                break;
            case 3:
                this->contenido += "<td>Juego</td>";
                this->contenido += "<td>" + ((Juego*)datos->Current->Dato)->GetPlataforma() + "</td>";
                break;
        }

        this->contenido += "</tr>";

        datos->Next();
    }

    this->contenido += "</table>";
    this->contenido += "<br />";
    this->contenido += "<a href='site?page=nuevoproducto'>Nuevo producto</a>";
}

void Sistema::contenidoNuevoProducto() {
    this->contenido = "";
    this->contenido += "<h1>Nuevo producto</h1>";

    this->contenido += "<form method='post' action='site?page=crearproducto'>";
    this->contenido += "<div class='formulario'>";
    this->contenido += "<ul>";
    this->contenido += "<li><label>Nombre</label><input name='nombre' type='text'></li>";
    this->contenido += "<li><label>Tipo</label><select name='tipo'><option value='1'>Musica</option><option value='2'>Pelicula</option><option value='3'>Juego</option></select></li>";
    this->contenido += "<li><label>Precio</label><input name='precio' type='text'></li>";
    this->contenido += "<li><label>Artista/Formato/Plataforma</label><input name='adicional' type='text'></li>";
    this->contenido += "<li><input type='submit' value='Crear'></li>";
    this->contenido += "</ul>";
    this->contenido += "</div>";
    this->contenido += "</form>";
}

void Sistema::contenidoCrearProducto() {
    this->contenido = "";

    this->contenido = "<meta http-equiv='Refresh' content='2; url=site?page=productos'>";
    this->contenido += "<h1>Producto creado!</h1>";

    DProducto* datos = &DProducto::GetInstancia();

    int tipo = atoi(web->Param("tipo").c_str());
    int precio = atof(web->Param("precio").c_str());

    switch ( tipo ) {
        case 1:
            datos->Add(new Musica(NULL, web->Param("nombre"), precio, web->Param("adicional")));
            break;
        case 2:
            datos->Add(new Pelicula(NULL, web->Param("nombre"), precio, web->Param("adicional")));
            break;
        case 3:
            datos->Add(new Juego(NULL, web->Param("nombre"), precio, web->Param("adicional")));
            break;
    }

    datos->Save();
}

void Sistema::contenidoEliminarProducto() {
    this->contenido = "";

    this->contenido = "<meta http-equiv='Refresh' content='2; url=site?page=productos'>";
    this->contenido += "<h1>Producto eliminado!</h1>";

    DProducto* datos = &DProducto::GetInstancia();
    int id = atoi(web->Param("id").c_str());
    datos->Find(id);

    datos->Remove(datos->Current->Dato);
    datos->Save();
}



void Sistema::contenidoVentasDelCliente() {
    this->contenido = "";

    DCliente* datos = &DCliente::GetInstancia();
    int id = atoi(web->Param("id").c_str());
    datos->Find(id);

    this->contenido += "<h1>Ventas de " + ((NCliente*)datos->Current->Dato)->GetNombre() + "</h1>";

    DVenta* ventast = &DVenta::GetInstancia();

    Lista* ventas = ventast->VentasDelCliente(id);

    DProducto* productos = &DProducto::GetInstancia();

    this->contenido += "<table>";

    while (ventas->Current) {
        this->contenido += "<tr>";

        productos->Find( ((NVenta*)ventas->Current->Dato)->GetIdProducto() );

        this->contenido += "<td>" + ((NProducto*)productos->Current->Dato)->GetNombre() + "</td>";
        this->contenido += "<td>" + Util::NumberToString(((NVenta*)ventas->Current->Dato)->GetPrecio()) + "</td>";
        this->contenido += "<td>" + ((NVenta*)ventas->Current->Dato)->GetFecha() + "</td>";
        this->contenido += "</tr>";

        ventas->Next();
    }

    this->contenido += "</table>";
    this->contenido += "<br />";
    this->contenido += "<a href='site?page=clientes'>Volver</a>";
}

void Sistema::contenidoPagosDelCliente() {
    this->contenido = "";

    DCliente* datos = &DCliente::GetInstancia();
    int id = atoi(web->Param("id").c_str());
    datos->Find(id);

    this->contenido += "<h1>Pagos de " + ((NCliente*)datos->Current->Dato)->GetNombre() + "</h1>";

    DPago* pagost = &DPago::GetInstancia();

    Lista* pagos = pagost->PagosDelCliente(id);

    this->contenido += "<table>";

    while (pagos->Current) {
        this->contenido += "<tr>";

        this->contenido += "<td>" + Util::NumberToString(((NPago*)pagos->Current->Dato)->GetAmortizado()) + "</td>";
        this->contenido += "<td>" + ((NPago*)pagos->Current->Dato)->GetFecha() + "</td>";
        this->contenido += "</tr>";

        pagos->Next();
    }

    this->contenido += "</table>";
    this->contenido += "<br />";
    this->contenido += "<a href='site?page=clientes'>Volver</a>";
}

void Sistema::contenidoVentas() {
    this->contenido = "";

    DCliente* datos = &DCliente::GetInstancia();

    this->contenido += "<h1>Ventas</h1>";

    DVenta* ventast = &DVenta::GetInstancia();

    DProducto* productos = &DProducto::GetInstancia();

    this->contenido += "<table>";

    while (ventast->Current) {
        this->contenido += "<tr>";

        int id_c;
        id_c = (((NVenta*)ventast->Current->Dato)->GetIdCliente());
        datos->Find(id_c);
        productos->Find( ((NVenta*)ventast->Current->Dato)->GetIdProducto() );

        this->contenido += "<td>" + ((NProducto*)productos->Current->Dato)->GetNombre() + "</td>";
        this->contenido += "<td>" + Util::NumberToString(((NVenta*)ventast->Current->Dato)->GetPrecio()) + "</td>";
        this->contenido += "<td>" + ((NVenta*)ventast->Current->Dato)->GetFecha() + "</td>";
        this->contenido += "<td>" + ((NCliente*)datos->Current->Dato)->GetNombre() + "</td>";
        this->contenido += "</tr>";

        ventast->Next();
    }

    this->contenido += "</table>";
    this->contenido += "<br />";
    this->contenido += "<a href='site?page=nuevaventa'>Nueva venta</a>";

}

void Sistema::contenidoNuevaVenta() {
    this->contenido = "";
    this->contenido += "<h1>Nueva venta</h1>";

    this->contenido += "<form method='post' action='site?page=crearventa'>";
    this->contenido += "<div class='formulario'>";
    this->contenido += "<ul>";

    this->contenido += "<li><label>Producto</label><select name='producto'>";

    DProducto* productos = &DProducto::GetInstancia();

    while (productos->Current) {
        this->contenido += "<option value='" + Util::NumberToString( productos->Current->Dato->GetId() ) + "'>" + ((NProducto*)productos->Current->Dato)->GetNombre() + "</option>";
        productos->Next();
    }

    this->contenido += "</select></li>";

    this->contenido += "<li><label>Cliente</label><select name='cliente'>";

    DCliente* clientes = &DCliente::GetInstancia();

    while (clientes->Current) {
        this->contenido += "<option value='" + Util::NumberToString( clientes->Current->Dato->GetId() ) + "'>" + ((NCliente*)clientes->Current->Dato)->GetNombre() + "</option>";
        clientes->Next();
    }

    this->contenido += "</select></li>";

    this->contenido += "<li><input type='submit' value='Crear'></li>";
    this->contenido += "</ul>";
    this->contenido += "</div>";
    this->contenido += "</form>";
}

void Sistema::contenidoCrearVenta() {
    this->contenido = "";

    this->contenido = "<meta http-equiv='Refresh' content='2; url=site?page=ventas'>";
    this->contenido += "<h1>Venta creada!</h1>";

    DVenta* datos = &DVenta::GetInstancia();

    int idproducto = atoi(web->Param("producto").c_str());
    int idcliente = atoi(web->Param("cliente").c_str());

    DProducto* productosd = &DProducto::GetInstancia();
    productosd->Find(idproducto);

    datos->Add(new NVenta(NULL, idproducto, ((NProducto*)productosd->Current->Dato)->GetPrecio(), Util::Now(), idcliente));

    datos->Save();
}




void Sistema::contenidoPagos() {
    this->contenido = "";

    DCliente* datos = &DCliente::GetInstancia();
    
    this->contenido += "<h1>Pagos</h1>";

    DPago* pagost = &DPago::GetInstancia();

    this->contenido += "<table>";

    while (pagost->Current) {
        int id_c;
        id_c = (((NPago*)pagost->Current->Dato)->GetIdCliente());
        datos->Find(id_c);
        this->contenido += "<tr>";

        this->contenido += "<td>" + Util::NumberToString(((NPago*)pagost->Current->Dato)->GetAmortizado()) + "</td>";
        this->contenido += "<td>" + ((NPago*)pagost->Current->Dato)->GetFecha() + "</td>";
        this->contenido += "<td>" + ((NCliente*)datos->Current->Dato)->GetNombre() + "</td>";
        this->contenido += "</tr>";

        pagost->Next();
    }

    this->contenido += "</table>";
    this->contenido += "<br />";
    this->contenido += "<a href='site?page=nuevopago'>Nuevo pago</a>";
}

void Sistema::contenidoNuevoPago() {
    this->contenido = "";
    this->contenido += "<h1>Nuevo pago</h1>";

    this->contenido += "<form method='post' action='site?page=crearpago'>";
    this->contenido += "<div class='formulario'>";
    this->contenido += "<ul>";

    this->contenido += "<li><label>Cliente</label><select name='cliente'>";

    DCliente* clientes = &DCliente::GetInstancia();

    while (clientes->Current) {
        this->contenido += "<option value='" + Util::NumberToString( clientes->Current->Dato->GetId() ) + "'>" + ((NCliente*)clientes->Current->Dato)->GetNombre() + "</option>";
        clientes->Next();
    }

    this->contenido += "</select></li>";

    this->contenido += "<li><label>Monto</label><input name='monto' type='text'></li>";

    this->contenido += "<li><input type='submit' value='Crear'></li>";
    this->contenido += "</ul>";
    this->contenido += "</div>";
    this->contenido += "</form>";
}

void Sistema::contenidoCrearPago() {
    this->contenido = "";

    this->contenido = "<meta http-equiv='Refresh' content='2; url=site?page=pagos'>";
    this->contenido += "<h1>Pago creado!</h1>";

    DPago* datos = &DPago::GetInstancia();

    int idcliente = atoi(web->Param("cliente").c_str());
    double monto = atof(web->Param("monto").c_str());

    datos->Add(new NPago(NULL, monto, Util::Now(), idcliente));

    datos->Save();
}